#include "MainWindow.h"

#include <iostream>

MainWindow::MainWindow() : archivoNivel(""),
						   cargarNivelLabel("Cargar nivel"),
						   cancelarButton("Salir"),
						   anteriorButton("Anterior"),
						   siguienteButton("Siguiente"),
						   guardarButton("Guardar") {
    set_border_width(10);
    set_title("Editor de niveles");
	
	/* Agrego los botones */
    botonesHBox.set_layout(Gtk::BUTTONBOX_END);
	botonesHBox.pack_start(cancelarButton, Gtk::PACK_SHRINK);
    botonesHBox.pack_start(siguienteButton, Gtk::PACK_SHRINK);
	    
    /* Senales */
    cancelarButton.signal_clicked().connect(sigc::ptr_fun(&Gtk::Main::quit));
    anteriorButton.signal_clicked().connect(sigc::mem_fun(*this,
                                            &MainWindow::anterior));
    siguienteButton.signal_clicked().connect(sigc::mem_fun(*this,
            &MainWindow::siguiente));
	cargarButton.signal_file_set().connect(sigc::mem_fun(*this,
                                           &MainWindow::cargar));
    guardarButton.signal_clicked().connect(sigc::mem_fun(*this,
                                           &MainWindow::guardar));

	menuBarHBox.pack_start(cargarNivelLabel, Gtk::PACK_SHRINK);
	menuBarHBox.pack_start(cargarButton, Gtk::PACK_SHRINK);
	menuBarHBox.pack_end(botonesHBox, Gtk::PACK_SHRINK);
	
	/* Agrego la pantalla de configuracion */
    mainVBox.add(configurationFrame);
    mainVBox.add(menuBarHBox);

    add(mainVBox);
    show_all_children(true);
}

MainWindow::~MainWindow() {
    if (configuracionGeneral) {
        delete configuracionGeneral;
    }

    if (configuracionTablero) {
        delete configuracionTablero;
    }
}

void MainWindow::anterior() {
	configuracionTablero = boardFrame.obtenerConfiguracion();
	
    /* Cambio a la pantalla de configuracion */
    mainVBox.remove(boardFrame);
    mainVBox.remove(menuBarHBox);

    /* Cambio los botones */
    botonesHBox.remove(anteriorButton);
    botonesHBox.remove(guardarButton);

    botonesHBox.pack_start(siguienteButton, Gtk::PACK_SHRINK);
	
	menuBarHBox.remove(botonesHBox);
	
	menuBarHBox.pack_start(cargarNivelLabel, Gtk::PACK_SHRINK);
	menuBarHBox.pack_start(cargarButton, Gtk::PACK_SHRINK);
	menuBarHBox.pack_end(botonesHBox, Gtk::PACK_SHRINK);

    /* Agrego a la ventana */
    mainVBox.add(configurationFrame);
    mainVBox.add(menuBarHBox);

    resize(configurationFrame.get_width(), configurationFrame.get_height());
    show_all_children(true);
}

void MainWindow::siguiente() {
	std::string error;
	
    if (!configurationFrame.validar(error)) {
        Gtk::MessageDialog dialog(*this, error);
        dialog.run();

        return;
    }

    if (configuracionGeneral) {
        delete configuracionGeneral;
    }

    configuracionGeneral = configurationFrame.obtenerConfiguracion();

    /* Cambio a la pantalla del tablero */
    mainVBox.remove(configurationFrame);
    mainVBox.remove(menuBarHBox);

    /* Seteo el tamano del tablero */
    boardFrame.getBoard()->setBoardSize(
                                configuracionGeneral->getCantidadFilas(),
                                configuracionGeneral->getCantidadColumnas());

	if (configuracionTablero) {
		boardFrame.getBoard()->setImagenes(configuracionTablero->getImagenes());
	}
	
    /* Cambio los botones */
    botonesHBox.remove(siguienteButton);
	
	menuBarHBox.remove(cargarNivelLabel);
	menuBarHBox.remove(cargarButton);

    botonesHBox.add(anteriorButton);
    botonesHBox.add(guardarButton);

    /* Agrego a la ventana */
    mainVBox.add(boardFrame);
    mainVBox.add(menuBarHBox);

    show_all_children(true);
}

void MainWindow::cargar() {	
	if (configuracionTablero) {
        delete configuracionTablero;
    }
    
    JSonReader jsonReader(cargarButton.get_filename());
	
	archivoNivel = cargarButton.get_filename();
	
	configuracionGeneral = jsonReader.getConfiguracionGeneral();
	configuracionTablero = jsonReader.getConfiguracionTablero();
	
	boardFrame.getBoard()->setBoardSize(
                                configuracionGeneral->getCantidadFilas(),
                                configuracionGeneral->getCantidadColumnas());
	
	configurationFrame.setConfiguracion(configuracionGeneral);
}

void MainWindow::guardar() {
    if (configuracionTablero) {
        delete configuracionTablero;
    }

    configuracionTablero = boardFrame.obtenerConfiguracion();

    JSonWriter jSonWriter;

    Gtk::MessageDialog dialog(*this, "Se guardó el nivel con el nombre: " +
                              jSonWriter.saveJSonFile(*configuracionGeneral,
                              *configuracionTablero, archivoNivel));
    dialog.run();
}
